import win32com.client
import pythoncom
import os
from PIL import ImageGrab
import time

def extract_images(excel_file):
    # 初始化COM
    pythoncom.CoInitialize()
    excel = None
    wb = None
    
    try:
        # 获取完整路径
        full_path = os.path.abspath(excel_file)
        output_dir = "extracted_images"
        if not os.path.exists(output_dir):
            os.makedirs(output_dir)
        
        # 创建Excel应用实例
        print("启动Excel...")
        excel = win32com.client.DispatchEx("Excel.Application")
        excel.Visible = False
        excel.DisplayAlerts = False
        
        # 打开工作簿
        print(f"打开文件: {full_path}")
        wb = excel.Workbooks.Open(full_path)
        sheet = wb.ActiveSheet
        
        # 获取工作表名称
        sheet_name = sheet.Name
        
        # 选择使用区域
        print("选择工作区域...")
        used_range = sheet.UsedRange
        used_range.Select()
        
        # 复制到剪贴板（使用位图格式）
        print("复制到剪贴板...")
        excel.Selection.CopyPicture(Appearance=1, Format=2)  # 1=屏幕显示，2=位图格式
        
        # 增加等待时间，确保剪贴板内容更新
        time.sleep(2)  # 延长等待时间
        
        # 从剪贴板获取图片
        print("从剪贴板获取图片...")
        image = ImageGrab.grabclipboard()
        
        if image:
            # 使用工作表名称命名图片
            output_path = os.path.join(output_dir, f"{sheet_name}.png")
            image.save(output_path)
            print(f"已保存图片: {output_path}")
        else:
            print("未能从剪贴板获取图片")
            # 尝试使用其他方法（如直接导出为图片）
            try:
                output_path = os.path.join(output_dir, f"{sheet_name}_export.png")
                sheet.ExportAsFixedFormat(17, output_path)  # 17=PNG格式
                print(f"已通过导出方式保存图片: {output_path}")
            except Exception as e:
                print(f"导出图片失败: {str(e)}")
        
    except Exception as e:
        print(f"发生错误: {str(e)}")
        
    finally:
        # 清理资源
        print("清理资源...")
        if wb:
            try:
                wb.Close(SaveChanges=False)
            except:
                pass
        
        if excel:
            try:
                excel.Quit()
            except:
                pass
        
        # 释放COM
        pythoncom.CoUninitialize()
        
        # 等待Excel完全关闭
        time.sleep(1)

if __name__ == "__main__":
    excel_file = "例子.xlsx"
    extract_images(excel_file)
